package site.wlwsjsx.iot_backend.mapper;

import org.apache.ibatis.annotations.Param;
import site.wlwsjsx.iot_backend.entity.WorkstationInfo;

import java.util.List;

/**
 * 工位基础信息 Mapper 接口
 * 对应表：workstation_info
 */
public interface WorkstationInfoMapper {

    /**
     * 新增工位基础信息（实验室添加工位时使用）
     *
     * @param workstationInfo 工位信息对象（id自增，modifyTime由数据库自动填充）
     * @return 受影响行数（成功为1）
     */
    int insert(WorkstationInfo workstationInfo);

    /**
     * 根据工位ID查询工位基础信息
     *
     * @param id 工位主键ID
     * @return 工位信息对象，无数据返回null
     */
    WorkstationInfo selectById(Integer id);

    /**
     * 根据工位编号查询工位基础信息（精准匹配，常用）
     *
     * @param workstationCode 工位编号（如：302-01）
     * @return 工位信息对象，无数据返回null
     */
    WorkstationInfo selectByCode(@Param("workstationCode") String workstationCode);

    /**
     * 根据实验室ID查询下属所有工位信息（实验室维度管理）
     *
     * @param belongLabId 所属实验室ID
     * @return 该实验室下所有工位列表，无数据返回空列表
     */
    List<WorkstationInfo> selectByLabId(@Param("belongLabId") Integer belongLabId);

    /**
     * 根据工位状态筛选工位（如：查询所有故障工位）
     *
     * @param workstationStatus 工位状态（normal/error/maintain）
     * @return 符合状态的工位列表
     */
    List<WorkstationInfo> selectByStatus(@Param("workstationStatus") String workstationStatus);

    /**
     * 动态更新工位信息
     *
     * @param workstationInfo 包含更新字段和主键（id或workstationCode）的对象
     * @return 受影响行数（成功为1）
     */
    int updateDynamic(WorkstationInfo workstationInfo);

    /**
     * 根据工位ID删除工位（实验室删除工位时使用）
     *
     * @param id 工位主键ID
     * @return 受影响行数
     */
    int deleteById(Integer id);

    /**
     * 批量更新实验室下所有工位的状态（如：实验室维护时批量设置工位为maintain）
     *
     * @param belongLabId       所属实验室ID
     * @param workstationStatus 目标状态
     * @return 受影响行数（更新的工位总数）
     */
    int batchUpdateStatusByLabId(
            @Param("belongLabId") Integer belongLabId,
            @Param("workstationStatus") String workstationStatus
    );

    int updateById(Integer id, WorkstationInfo workstationInfo);

    int updateByCode(String workstationCode, WorkstationInfo workstationInfo);
}